# coding=utf-8
"""
# Author : Hunter Oakley
# Time   : 2022/6/11 17:22
# Descripation: 练习测试文件
"""
import random
from PIL import Image,ImageDraw,ImageFont,ImageFilter

def check_code(width=120,height=30,char_length=5,font_file='Monaco.ttf',font_size=20):
    """
    生成图片验证码
    """
    code = []
    img = Image.new(mode="RGB",size=(width,height),color=(255,255,255))
    draw = ImageDraw.Draw(img,mode="RGB")

    def rndChar():
        """
        生成随机码
        """
        return chr(random.randint(65,90))

    def rndColor():
        """
        生成随机颜色
        """
        return (random.randint(0,255),random.randint(10,255),random.randint(64,255))

    # 在图片上写入文字
    font = ImageFont.truetype(font_file,font_size)
    for i in range(char_length):
        char = rndChar()
        code.append(char)
        h = random.randint(0,4)
        # draw.text()的参数
        # 第一个参数：表示起始坐标
        # 第二个参数：表示写入内容
        # 第三个参数：表示颜色
        draw.text(xy=[i*width/char_length,h],text=char,font=font,fill=rndColor())

    # 写干扰点
    for i in range(40):
        draw.point([random.randint(0,width),random.randint(0,height)],fill=rndColor())

    # 写干扰圆圈
    for i in range(40):
        draw.point([random.randint(0,width),random.randint(0,height)],fill=rndColor())
        x = random.randint(0,width)
        y = random.randint(0,height)
        # draw.arc()函数参数如下
        # 第一个参数：表示起始坐标和结束坐标（圆要画在其中间）
        # 第二个参数：表示开始角度
        # 第三个参数：表示结束角度
        # 第四个参数：表示颜色
        draw.arc((x,y,x+4,y+4),0,90,fill=rndColor())

    # 画干扰线
    for i in range(5):
        x1 = random.randint(0, width)
        y1 = random.randint(0, height)
        x2 = random.randint(0, width)
        y2 = random.randint(0, height)
        draw.line((x1,y1,x2,y2),fill=rndColor())

    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 过滤图像

    # 返回img以及写入的文字
    return img,''.join(code)


if __name__ == '__main__':
    img,code_string = check_code()
    print(code_string)
    with open("code.png","wb")as f:
        img.save(f,format="png")






